Skip to content

symbol 是否可以遍历

Object.keys、for in 遍历不出来 Symbol 如果想要遍历可以通过 Object.getOwnPropertySymbols() 或者通过 Reflect.ownKeys 遍历 但拥有 Symbol.iterator 属性的的可以遍历 数组、字符串、map

遍历

对于一个对象,在忽略其继承的属性的情况下,获取到的属性集合的数量排序为 Reflect.ownKeys > Object.getOwnPropertyNames(但包含所有不可枚举的属性组成的数组) > Object.keys(可枚举属性组) > Object.getOwnPropertySymbols

js
let mySymbol = Symbol();
console.log(typeof mySymbol[Symbol.iterator] === "function"); // false

Symbol 怎么用?是否可以为空?

  • Symbol 定后值是唯一的,通常用于给对象添加唯一键值 (防止被覆盖)
  • 它不用 new 会报错 new Symbol 报错
  • for...in 不会遍历出来 Symbol 属性 (模拟类的私有方法)只能通过 Object.getOwnPropertySymbols
  • JSON.stringify 完全忽略 Symbol
  • 可以为空
js
let sym2 = Symbol("foo");
let sym3 = Symbol("foo");
Symbol("foo") === Symbol("foo"); // false
js
const obj = {
  [Symbol.iterator]: function () {
    return this;
  },
  next: function () {
    return {
      done: true,
      value: 1,
    };
  },
};

Symbol.for 全局 symbol

  • 该方法在 “全局 Symbol 注册中心” 创建了一个 Symbol .equal(Symbol.for('foo'), Symbol.for('foo'));
js
var myObj = {};
var fooSym = Symbol.for("foo");
var otherSym = Symbol.for("foo");
myObj[fooSym] = "baz";
myObj[otherSym] = "bing";
assert(fooSym === otherSym);
assert(myObj[fooSym] === "bing");
assert(myObj[otherSym] === "bing");
  • 判断哪些 Symbol 是唯一的
js
var localFooSymbol = Symbol("foo");
var globalFooSymbol = Symbol.for("foo");
Symbol.keyFor(localFooSymbol) === undefined;
Symbol.keyFor(globalFooSymbol) === "foo";
Symbol.for(Symbol.keyFor(globalFooSymbol)) === Symbol.for("foo");

在 MIT 许可下发布